package com.xb.loan.cashier.biz.task.bankcomm;

import com.xb.loan.cashier.biz.dao.bean.CashierPayChannel;
import com.xb.loan.cashier.biz.pay.bankcomm.BankcommConst;
import com.xb.loan.cashier.biz.pay.bankcomm.BankcommPayment;
import com.xb.loan.cashier.biz.task.ThirdAccountChargeTask;
import com.xb.loan.cashier.biz.task.bean.ThirdAccountBean;
import com.xb.loan.cashier.biz.task.bean.ThirdAccountChargeBean;
import com.xb.loan.cashier.service.constant.ICashierEnumConst;
import com.xb.loan.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * 交行充值对账任务
 */
@Component(value="bankcommAccountChargeTask")
@Scope(value="prototype")
public class BankcommAccountChargeTask extends ThirdAccountChargeTask {
    
    private static final Logger logger = LoggerFactory.getLogger(BankcommAccountChargeTask.class);


    @Override
    protected boolean hasThirdAccountTime() {
        return true;
    }

    @Override
    protected int getPayChannelType() {
        return ICashierEnumConst.CashierPayChannelType.BANKCOMM.getType();
    }

	@Override
    protected Map<String, ThirdAccountBean> getThirdAccountDatas(int pageNo, int pageSize, String day, CashierPayChannel channel) {
		if (pageNo==2) {//没有分页只查一次
			return null;
		}
    	HashMap<String, ThirdAccountBean> result = new HashMap<String, ThirdAccountBean>();
    	Map<String, Object> xmlResMap = BankcommPayment.chargeAccount(channel.getQueryUrl(), channel.getChannelUser(), day);
    	if (xmlResMap==null) {
        	logger.info("getThirdAccountDatas xmlResMap is null");
			return null;
		}
        Map<String, String> headResMap = (Map<String, String>)xmlResMap.get(BankcommConst.HEAD);
		String rspType = headResMap.get(BankcommConst.RSP_TYPE);
		if (BankcommConst.FAIL.equals(rspType)) {
			String errorCode = headResMap.get(BankcommConst.RSP_CODE);
			String errorMsg = headResMap.get(BankcommConst.RSP_MSG);
			logger.info("getThirdAccountDatas 交行充值对账异常   day="+day+",rspType="+rspType+",errorCode="+errorCode+",errorMsg="+errorMsg);
			return null;
		}
		Map<String, String> bodyResMap = (Map<String, String>)xmlResMap.get(BankcommConst.BODY);
		String settlementStr = bodyResMap.get("SettlementFile");
    	List<List<String>> list = parse(settlementStr);
		for (List<String> orderList: list) {
			 ThirdAccountChargeBean order = new ThirdAccountChargeBean();
			 order.setOrderId(orderList.get(0));
    		 order.setOrderIdThird(orderList.get(3));
    		 order.setMoney(Double.parseDouble(orderList.get(5)));
//	             order.setBuyAccount(buyer_account);TODO:没找到匹配字段
//				 order.setAccountDayThird();TODO:没找到匹配字段
             order.setAccountDay(null);
             order.setStatus(ThirdAccountBean.STATUS_SUCCESS);
             result.put(order.getOrderId(), order);
		}
    
        return result;
    }
    
    private List<List<String>> parse(String settlementStr){
    	List<List<String>> result = new ArrayList<List<String>>();
    	String s1 = "==============================================="
    			+ "=================================================="
    			+ "===================================================";
		String s2 = "-----------------------------------------------"
				+ "--------------------------------------------------"
				+ "---------------------------------------------------";
    	if (StringUtils.isNotEmpty(settlementStr)) {
			String[] blockInfoArray = settlementStr.split(s1);//分割为区块
			String[] orderInfoArray = blockInfoArray[1].split(s2);//获取支付订单信息
			String orderDatas = orderInfoArray[1].replaceAll(" +", " ").trim();//处理订单数据，多个空格替换成一个空格
			String[] orderFieldArray = orderDatas.split(" ");//根据空格获取所有字段
			List<String> orderFieldList = new ArrayList<String>();
			orderFieldList.addAll(Arrays.asList(orderFieldArray));//将数组转换为list
			while (true) {
				if (orderFieldList.size()==0) {
					break;
				}
				List<String> orderList = new ArrayList<String>(9);//每个订单9个字段
				while (true) {
					String field = orderFieldList.remove(0);
					if (StringUtils.isNotEmpty(field)) {
						orderList.add(field);
					}
					if (orderList.size()==9) {
						result.add(orderList);
						break;
					}
				}
			}
		}
    	return result;
    }
    
    public static void main(String[] args) {
    	String settlementStr=" 网上支付特约商户交易对账清单                                                         ----------------------------------------------商户客户号：301310063009501    商户名称：交行在线支付测试商户所属分行：上海市分行           交易币种: 人民币                   清算日期:2025年05月26日                           制表日期:2015年01月29日消费====================================================================================================================================================      订单号             订单日期       交易日期-时间         支付流水号     卡类型            交易金额     商户手续费      实际结算金额  商户批次号----------------------------------------------------------------------------------------------------------------------------------------------------        20130129134744   20130129     20150129-135608           A147F471     借记卡                1.00           0.00              1.00           -  4180:100103:00208292   20150129     20150129-140820           A147F472     借记卡              234.00           0.00            234.00           -      2015012900101517   20150129     20150129-141531           A147F473     借记卡               30.76           0.00             30.76           -  20150129301536872000   20150129     20150129-141532           A147F474     借记卡               10.00           0.00             10.00           -      1422511660411984   20150129     20150129-141543           A147F475     借记卡               30.00           0.00             30.00           -      1422511766606021   20150129     20150129-141724           A147F477     借记卡               30.00           0.00             30.00           -  20150129301539081612   20150129     20150129-141839           A147F478 他行银联卡               10.00           2.00              8.00           -      1422511854738084   20150129     20150129-141855           A147F479     借记卡               30.00           0.00             30.00           -  20150129301539081612   20150129     20150129-141905           A147F47A     借记卡               10.00           0.00             10.00           -      1422511886771477   20150129     20150129-141931           A147F47C     借记卡              325.00           0.00            325.00           -      1422511685544853   20150129     20150129-141602           A147F476     借记卡               60.00           0.00             60.00           -  20150129142245115409   20150129     20150129-143100           A147F47E     借记卡                0.01           0.00              0.01           -  20150129142428963884   20150129     20150129-143240           A147F47F     借记卡                0.01           0.00              0.01           -      2015012900101520   20150129     20150129-143247           A147F480     借记卡                0.02           0.00              0.02           -        20140129141600   20140129     20150129-143500           A147F481     借记卡                1.00           0.00              1.00           -  20150129142720113153   20150129     20150129-143524           A147F483     借记卡                0.01           0.00              0.01           -        20140129141200   20140129     20150129-143900           A147E422     贷记卡                2.00           0.00              2.00           -        20150321141233   20140129     20150129-144110           A147E526     贷记卡                3.00           0.00              3.00           -       201501292296973   20150129     20150129-142814           A147F47D     借记卡               35.00           0.00             35.00        comm====================================================================================================================================================总笔数：     17    交易金额：          806.81 手续费总额：            2.00 实际结算金额：          804.81 退货====================================================================================================================================================      交易日期-时间         退款流水号     退款类型           退款金额                 订单号   订单日期	应退还手续费金额----------------------------------------------------------------------------------------------------------------------------------------------------    20150129-143101           1147F482         退货              50.28       2015012800040440   20150128               0.15====================================================================================================================================================总笔数：      1    退款金额：           50.28 应退还手续费总额：            0.15 撤销====================================================================================================================================================      交易日期-时间         退款流水号     退款类型           退款金额                 订单号   订单日期----------------------------------------------------------------------------------------------------------------------------------------------------====================================================================================================================================================总笔数：      0    退款金额：            0.00 ";
    	List<List<String>> list = new BankcommAccountChargeTask().parse(settlementStr);
    	System.out.println(list.size());
    	System.out.println(list.toString());
	}
}
